ãœãããŠã§ã¢éçºã«ãããé«åºŠãªãžã§ããªãã¯å¶çŽãšè€éãªåé¢ä¿ãæ¢æ±ã匷åãªåã·ã¹ãã æè¡ãéããŠãããå ç¢ã§æè»ãä¿å®ããããã³ãŒããæ§ç¯ããæ¹æ³ãåŠã³ãŸãããã
é«åºŠãªãžã§ããªãã¯å¶çŽïŒè€éãªåé¢ä¿ããã¹ã¿ãŒãã
ãžã§ããªã¯ã¹ã¯ãå€ãã®ææ°ããã°ã©ãã³ã°èšèªã«ããã匷åãªæ©èœã§ãããéçºè ãåå®å šæ§ãç ç²ã«ããããšãªãã倿§ãªåã§åäœããã³ãŒããèšè¿°ããããšãå¯èœã«ããŸããåºæ¬çãªãžã§ããªã¯ã¹ã¯æ¯èŒçåçŽã§ãããé«åºŠãªãžã§ããªãã¯å¶çŽã¯è€éãªåé¢ä¿ã®äœæãå¯èœã«ããããå ç¢ã§æè»ãä¿å®ããããã³ãŒããžãšå°ããŸãããã®èšäºã§ã¯ãé«åºŠãªãžã§ããªãã¯å¶çŽã®äžçãæ·±ãæãäžããç°ãªãããã°ã©ãã³ã°èšèªã®äŸã亀ããªããããã®å¿çšãšå©ç¹ãæ¢ããŸãã
ãžã§ããªãã¯å¶çŽãšã¯ïŒ
ãžã§ããªãã¯å¶çŽã¯ãåãã©ã¡ãŒã¿ãæºããã¹ãèŠä»¶ãå®çŸ©ããŸãããããã®å¶çŽã課ãããšã§ããžã§ããªãã¯ã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ããŸãã¯ã¡ãœããã§äœ¿çšã§ããåãå¶éã§ããŸããããã«ãããããç¹åãããåå®å šãªã³ãŒããèšè¿°ããããšãå¯èœã«ãªããŸãã
ããç°¡åã«èšãã°ãã¢ã€ãã ããœãŒãããããŒã«ãäœæããŠãããšæ³åããŠãã ããããœãŒããããã¢ã€ãã ãæ¯èŒå¯èœã§ããããšãã€ãŸãäºãã«é åºä»ããããæ¹æ³ãæã£ãŠããããšãä¿èšŒããããšèãããããããŸããããžã§ããªãã¯å¶çŽã䜿çšãããšããã®èŠä»¶ã匷å¶ã§ããæ¯èŒå¯èœãªåã®ã¿ããœãŒãããŒã«ã§äœ¿çšãããããšãä¿èšŒã§ããŸãã
åºæ¬çãªãžã§ããªãã¯å¶çŽ
é«åºŠãªå¶çŽã«æ·±ãå ¥ãåã«ããŸãåºæ¬ãç°¡åã«åŸ©ç¿ããŸããããäžè¬çãªå¶çŽã«ã¯ä»¥äžã®ãããªãã®ããããŸãã
- ã€ã³ã¿ãŒãã§ãŒã¹å¶çŽ: åãã©ã¡ãŒã¿ãç¹å®ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããããšãèŠæ±ããŸãã
- ã¯ã©ã¹å¶çŽ: åãã©ã¡ãŒã¿ãç¹å®ã®ã¯ã©ã¹ãç¶æ¿ããããšãèŠæ±ããŸãã
- 'new()' å¶çŽ: åãã©ã¡ãŒã¿ãåŒæ°ãªãã®ã³ã³ã¹ãã©ã¯ã¿ãæã€ããšãèŠæ±ããŸãã
- 'struct' ãŸã㯠'class' å¶çŽ: (C#åºæ) åãã©ã¡ãŒã¿ãå€å (struct) ãŸãã¯åç §å (class) ã«å¶éããŸãã
äŸãã°ãC#ã§ã¯ïŒ
public interface IStorable
{
string Serialize();
void Deserialize(string data);
}
public class DataRepository<T> where T : IStorable, new()
{
public void Save(T item)
{
string data = item.Serialize();
// Save data to storage
}
public T Load(string data)
{
T item = new T();
item.Deserialize(data);
return item;
}
}
ããã§ã`DataRepository` ã¯ã©ã¹ã¯åãã©ã¡ãŒã¿ `T` ãæã€ãžã§ããªãã¯ã¯ã©ã¹ã§ãã`where T : IStorable, new()` å¶çŽã¯ã`T` ã `IStorable` ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããåŒæ°ãªãã®ã³ã³ã¹ãã©ã¯ã¿ãæã€ããšãæå®ããŠããŸããããã«ããã`DataRepository` ã¯å `T` ã®ãªããžã§ã¯ããå®å šã«ã·ãªã¢ã«åããã·ãªã¢ã«åãããã³ã€ã³ã¹ã¿ã³ã¹åããããšãã§ããŸãã
é«åºŠãªãžã§ããªãã¯å¶çŽïŒåºæ¬ãè¶ ããŠ
é«åºŠãªãžã§ããªãã¯å¶çŽã¯ãåçŽãªã€ã³ã¿ãŒãã§ãŒã¹ãã¯ã©ã¹ã®ç¶æ¿ãè¶ ãããã®ã§ãããããã¯åéã®è€éãªé¢ä¿ãå«ã¿ã匷åãªåã¬ãã«ããã°ã©ãã³ã°æè¡ãå¯èœã«ããŸãã
1. äŸååãšåé¢ä¿
äŸååã¯ãå€ã«äŸåããåã§ããæ¬æ ŒçãªäŸååã·ã¹ãã ã¯äž»æµã®èšèªã§ã¯æ¯èŒççããã§ãããé«åºŠãªãžã§ããªãã¯å¶çŽã¯äŸååã®ããã€ãã®åŽé¢ãã·ãã¥ã¬ãŒãã§ããŸããäŸãã°ãã¡ãœããã®æ»ãå€ã®åãå ¥ååã«äŸåããããšãä¿èšŒãããå Žåãªã©ã§ãã
äŸ: ããŒã¿ããŒã¹ã¯ãšãªãäœæãã颿°ãèããŠã¿ãŸããããäœæãããç¹å®ã®ã¯ãšãªãªããžã§ã¯ãã¯ãå ¥åããŒã¿ã®åã«äŸåããã¯ãã§ããç°ãªãã¯ãšãªåã衚ãã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããåå¶çŽã䜿çšããŠæ£ããã¯ãšãªãªããžã§ã¯ããè¿ãããããã«åŒ·å¶ããããšãã§ããŸãã
TypeScriptã§ã¯ïŒ
interface BaseQuery {}
interface UserQuery extends BaseQuery {
//User specific properties
}
interface ProductQuery extends BaseQuery {
//Product specific properties
}
function createQuery<T extends { type: 'user' | 'product' }>(config: T):
T extends { type: 'user' } ? UserQuery : ProductQuery {
if (config.type === 'user') {
return {} as UserQuery; // In real implementation, build the query
} else {
return {} as ProductQuery; // In real implementation, build the query
}
}
const userQuery = createQuery({ type: 'user' }); // type of userQuery is UserQuery
const productQuery = createQuery({ type: 'product' }); // type of productQuery is ProductQuery
ãã®äŸã§ã¯ãæ¡ä»¶å (`T extends { type: 'user' } ? UserQuery : ProductQuery`) ã䜿çšããŠãå ¥åæ§æã® `type` ããããã£ã«åºã¥ããŠæ»ãå€ã®åãæ±ºå®ããŠããŸããããã«ãããã³ã³ãã€ã©ãè¿ãããã¯ãšãªãªããžã§ã¯ãã®æ£ç¢ºãªåãèªèã§ããŸãã
2. åãã©ã¡ãŒã¿ã«åºã¥ãå¶çŽ
匷åãªãã¯ããã¯ã®äžã€ã¯ãä»ã®åãã©ã¡ãŒã¿ã«äŸåããå¶çŽãäœæããããšã§ããããã«ããããžã§ããªãã¯ã¯ã©ã¹ãŸãã¯ã¡ãœããã§äœ¿çšãããç°ãªãåéã®é¢ä¿ã衚çŸã§ããŸãã
äŸ: ãããã©ãŒãããããå¥ã®ãã©ãŒããããžããŒã¿ã倿ããããŒã¿ããããŒãæ§ç¯ããŠãããšããŸããããå ¥åå `TInput` ãšåºåå `TOutput` ããããšããŸãã`TInput` ãã `TOutput` ãžå€æã§ããããããŒé¢æ°ãååšããããšã匷å¶ã§ããŸãã
TypeScriptã§ã¯ïŒ
interface Mapper<TInput, TOutput> {
map(input: TInput): TOutput;
}
function transform<TInput, TOutput, TMapper extends Mapper<TInput, TOutput>>(
input: TInput,
mapper: TMapper
): TOutput {
return mapper.map(input);
}
class User {
name: string;
age: number;
}
class UserDTO {
fullName: string;
years: number;
}
class UserToUserDTOMapper implements Mapper<User, UserDTO> {
map(user: User): UserDTO {
return { fullName: user.name, years: user.age };
}
}
const user = { name: 'John Doe', age: 30 };
const mapper = new UserToUserDTOMapper();
const userDTO = transform(user, mapper); // type of userDTO is UserDTO
ãã®äŸã§ã¯ã`transform` 㯠`TInput` åã®å ¥åãš `TMapper` åã® `mapper` ãåãåããžã§ããªãã¯é¢æ°ã§ãã`TMapper extends Mapper<TInput, TOutput>` ãšããå¶çŽã«ãããããããŒã `TInput` ãã `TOutput` ãžæ£ãã倿ã§ããããšãä¿èšŒãããŸããããã«ããã倿ããã»ã¹äžã®åå®å šæ§ã匷å¶ãããŸãã
3. ãžã§ããªãã¯ã¡ãœããã«åºã¥ãå¶çŽ
ãžã§ããªãã¯ã¡ãœããããã¡ãœããå ã§äœ¿çšãããåã«äŸåããå¶çŽãæã€ããšãã§ããŸããããã«ãããããŸããŸãªåã·ããªãªã«ããç¹åããé©å¿å¯èœãªã¡ãœãããäœæã§ããŸãã
äŸ: ç°ãªãåã®2ã€ã®ã³ã¬ã¯ã·ã§ã³ã1ã€ã®ã³ã¬ã¯ã·ã§ã³ã«çµåããã¡ãœãããèããŠã¿ãŸããããäž¡æ¹ã®å ¥ååãããæå³ã§äºææ§ãããããšãä¿èšŒããããšèãããããããŸããã
C#ã§ã¯ïŒ
public interface ICombinable<T>
{
T Combine(T other);
}
public static class CollectionExtensions
{
public static IEnumerable<TResult> CombineCollections<T1, T2, TResult>(
this IEnumerable<T1> collection1,
IEnumerable<T2> collection2,
Func<T1, T2, TResult> combiner)
{
foreach (var item1 in collection1)
{
foreach (var item2 in collection2)
{
yield return combiner(item1, item2);
}
}
}
}
// Example usage
List<int> numbers = new List<int> { 1, 2, 3 };
List<string> strings = new List<string> { "a", "b", "c" };
var combined = numbers.CombineCollections(strings, (number, str) => number.ToString() + str);
// combined will be IEnumerable<string> containing: "1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"
ããã§ã¯ãçŽæ¥çãªå¶çŽã§ã¯ãããŸãããã`Func<T1, T2, TResult> combiner` ãã©ã¡ãŒã¿ãå¶çŽãšããŠæ©èœããŸããããã¯ã`T1` ãš `T2` ãåãåãã`TResult` ãçæãã颿°ãååšããªããã°ãªããªãããšã瀺ããŠããŸããããã«ãããçµåæäœãé©åã«å®çŸ©ãããåå®å šæ§ãä¿èšŒãããŸãã
4. é«éåïŒãšãã®ã·ãã¥ã¬ãŒã·ã§ã³ïŒ
é«éåïŒHKTïŒã¯ãä»ã®åããã©ã¡ãŒã¿ãšããŠåãåã§ããJavaãC#ã®ãããªèšèªã§ã¯çŽæ¥ãµããŒããããŠããŸãããããžã§ããªã¯ã¹ã䜿çšããŠåæ§ã®å¹æãéæãããã¿ãŒã³ãçšããããšãã§ããŸããããã¯ããªã¹ãããªãã·ã§ã³ããã¥ãŒãã£ãŒãªã©ã®ç°ãªãã³ã³ããåãæœè±¡åããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
äŸ: ã³ã³ããå ã®åèŠçŽ ã«é¢æ°ãé©çšããçµæãåãåã®æ°ããã³ã³ããã«åéãã `traverse` 颿°ãå®è£ ããŸãã
Javaã®å ŽåïŒã€ã³ã¿ãŒãã§ãŒã¹ã§é«éåãã·ãã¥ã¬ãŒãïŒïŒ
interface Container<T, C extends Container<T, C>> {
<R> C map(Function<T, R> f);
}
class ListContainer<T> implements Container<T, ListContainer<T>> {
private final List<T> list;
public ListContainer(List<T> list) {
this.list = list;
}
@Override
public <R> ListContainer<R> map(Function<T, R> f) {
List<R> newList = new ArrayList<>();
for (T element : list) {
newList.add(f.apply(element));
}
return new ListContainer<>(newList);
}
}
interface Function<T, R> {
R apply(T t);
}
// Usage
List<Integer> numbers = Arrays.asList(1, 2, 3);
ListContainer<Integer> numberContainer = new ListContainer<>(numbers);
ListContainer<String> stringContainer = numberContainer.map(i -> "Number: " + i);
`Container` ã€ã³ã¿ãŒãã§ãŒã¹ã¯ããžã§ããªãã¯ãªã³ã³ããåã衚ããŸããèªå·±åç §åã®ãžã§ããªãã¯å `C extends Container<T, C>` ã¯é«éåãã·ãã¥ã¬ãŒããã`map` ã¡ãœãããåãåã®ã³ã³ãããè¿ãããšãå¯èœã«ããŸãããã®ã¢ãããŒãã¯ãåã·ã¹ãã ãæŽ»çšããŠãèŠçŽ ã倿ããªããã³ã³ããæ§é ãç¶æããŸãã
5. æ¡ä»¶åãšãããã³ã°å
TypeScriptã®ãããªèšèªã¯ãæ¡ä»¶åããããã³ã°åãšãã£ãããæŽç·Žãããåæäœæ©èœãæäŸããŸãããããã®æ©èœã¯ããžã§ããªãã¯å¶çŽã®èœåãå€§å¹ ã«åŒ·åããŸãã
äŸ: ç¹å®ã®åã«åºã¥ããŠãªããžã§ã¯ãã®ããããã£ãæœåºãã颿°ãå®è£ ããŸãã
TypeScriptã§ã¯ïŒ
type PickByType<T, ValueType> = {
[Key in keyof T as T[Key] extends ValueType ? Key : never]: T[Key];
};
interface Person {
name: string;
age: number;
address: string;
isEmployed: boolean;
}
type StringProperties = PickByType<Person, string>; // { name: string; address: string; }
const person: Person = {
name: "Alice",
age: 30,
address: "123 Main St",
isEmployed: true,
};
const stringProps: StringProperties = {
name: person.name,
address: person.address,
};
ããã§ã`PickByType` ã¯å `T` ã®ããããã£ãã€ãã¬ãŒããããããã³ã°åã§ããåããããã£ã«ã€ããŠããã®ããããã£ã®åã `ValueType` ãæ¡åŒµããŠããããã§ãã¯ããŸããæ¡åŒµããŠããå Žåããã®ããããã£ã¯çµæã®åã«å«ãŸããããã§ãªããã° `never` ã䜿çšããŠé€å€ãããŸããããã«ãããæ¢åã®åã®ããããã£ã«åºã¥ããŠæ°ããåãåçã«äœæã§ããŸãã
é«åºŠãªãžã§ããªãã¯å¶çŽã®å©ç¹
é«åºŠãªãžã§ããªãã¯å¶çŽã䜿çšãããšãããã€ãã®å©ç¹ãåŸãããŸãã
- 匷åãããåå®å šæ§: åã®é¢ä¿ãæ£ç¢ºã«å®çŸ©ããããšã§ãå®è¡æã«ããçºèŠã§ããªãã£ããšã©ãŒãã³ã³ãã€ã«æã«ææã§ããŸãã
- ã³ãŒãã®åå©çšæ§ã®åäž: ãžã§ããªã¯ã¹ã¯ãåå®å šæ§ãç ç²ã«ããããšãªã倿§ãªåã§åäœããã³ãŒããèšè¿°ã§ããããã«ããããšã§ãã³ãŒãã®åå©çšãä¿é²ããŸãã
- ã³ãŒãã®æè»æ§ã®åäž: é«åºŠãªå¶çŽã«ãããããåºç¯ãªã·ããªãªã«å¯Ÿå¿ã§ãããããæè»ã§é©å¿æ§ã®é«ãã³ãŒããäœæã§ããŸãã
- ã³ãŒãã®ä¿å®æ§ã®åäž: åå®å šãªã³ãŒãã¯ãæéã®çµéãšãšãã«çè§£ããããããªãã¡ã¯ã¿ãªã³ã°ãããããä¿å®ãããããªããŸãã
- 衚çŸå: ãããããªããã°äžå¯èœã§ãã£ãïŒãããã¯å°ãªããšãéåžžã«é¢åã§ãã£ãïŒè€éãªåé¢ä¿ãèšè¿°ããèœåãè§£ãæŸã¡ãŸãã
課é¡ãšèæ ®äºé
匷åã§ããäžæ¹ã§ãé«åºŠãªãžã§ããªãã¯å¶çŽã¯èª²é¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- è€éæ§ã®å¢å : é«åºŠãªå¶çŽãçè§£ãå®è£ ããã«ã¯ãåã·ã¹ãã ã«å¯Ÿããããæ·±ãçè§£ãå¿ èŠã§ãã
- åŠç¿æ²ç·ã®æ¥åŸé : ãããã®ãã¯ããã¯ãç¿åŸããã«ã¯æéãšåŽåãããããŸãã
- éå°ãªèšèšã®å¯èœæ§: ãããã®æ©èœãè³¢æã«äœ¿çšããäžå¿ èŠãªè€éããé¿ããããšãéèŠã§ãã
- ã³ã³ãã€ã©ã®ããã©ãŒãã³ã¹: å Žåã«ãã£ãŠã¯ãè€éãªåå¶çŽãã³ã³ãã€ã©ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
å®äžçã§ã®å¿çš
é«åºŠãªãžã§ããªãã¯å¶çŽã¯ãããŸããŸãªå®äžçã®ã·ããªãªã§åœ¹ç«ã¡ãŸãã
- ããŒã¿ã¢ã¯ã»ã¹ã¬ã€ã€ãŒ (DAL): åå®å šãªããŒã¿ã¢ã¯ã»ã¹ãåããæ±çšãªããžããªã®å®è£ ã
- ãªããžã§ã¯ããªã¬ãŒã·ã§ãã«ããã㌠(ORM): ããŒã¿ããŒã¹ããŒãã«ãšã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ãéã®åãããã³ã°ã®å®çŸ©ã
- ãã¡ã€ã³é§åèšèš (DDD): ãã¡ã€ã³ã¢ãã«ã®æŽåæ§ã確ä¿ããããã®åå¶çŽã®åŒ·å¶ã
- ãã¬ãŒã ã¯ãŒã¯éçº: è€éãªåé¢ä¿ãæã€åå©çšå¯èœãªã³ã³ããŒãã³ãã®æ§ç¯ã
- UIã©ã€ãã©ãª: ããŸããŸãªããŒã¿åã§åäœããé©å¿æ§ã®é«ãUIã³ã³ããŒãã³ãã®äœæã
- APIèšèš: åæ å ±ãæŽ»çšããIDL (ã€ã³ã¿ãŒãã§ãŒã¹å®çŸ©èšèª) ããŒã«ã䜿çšããŠãç°ãªããµãŒãã¹ã€ã³ã¿ãŒãã§ãŒã¹éãããã«ã¯èšèªã®å£ãè¶ããããŒã¿ã®äžè²«æ§ãä¿èšŒã
ãã¹ããã©ã¯ãã£ã¹
ããã§ã¯ãé«åºŠãªãžã§ããªãã¯å¶çŽã广çã«äœ¿çšããããã®ããã€ãã®ãã¹ããã©ã¯ãã£ã¹ã玹ä»ããŸãã
- ã·ã³ãã«ã«å§ãã: åºæ¬çãªå¶çŽããå§ããå¿ èŠã«å¿ããŠããè€éãªå¶çŽãåŸã ã«å°å ¥ããŸãã
- 培åºçãªããã¥ã¡ã³ãå: å¶çŽã®ç®çãšäœ¿çšæ³ãæç¢ºã«ããã¥ã¡ã³ãåããŸãã
- å³å¯ãªãã¹ã: å¶çŽãæåŸ éãã«æ©èœããŠããããšã確èªããããã«ãå æ¬çãªãã¹ããäœæããŸãã
- å¯èªæ§ãèæ ®ãã: ã³ãŒãã®å¯èªæ§ãåªå ããçè§£ãé£ããé床ã«è€éãªå¶çŽãé¿ããŸãã
- æè»æ§ãšå ·äœæ§ã®ãã©ã³ã¹: æè»ãªã³ãŒããäœæããããšãšãç¹å®ã®åèŠä»¶ã匷å¶ããããšã®éã§ãã©ã³ã¹ãåãããã«åªããŸãã
- é©åãªããŒã«ã䜿çšãã: éçè§£æããŒã«ããªã³ã¿ãŒã¯ãè€éãªãžã§ããªãã¯å¶çŽã«é¢ããæœåšçãªåé¡ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
çµè«
é«åºŠãªãžã§ããªãã¯å¶çŽã¯ãå ç¢ã§æè»ãä¿å®ããããã³ãŒããæ§ç¯ããããã®åŒ·åãªããŒã«ã§ãããããã®ãã¯ããã¯ã广çã«çè§£ãé©çšããããšã§ãããã°ã©ãã³ã°èšèªã®åã·ã¹ãã ã®å¯èœæ§ãæå€§éã«åŒãåºãããšãã§ããŸããè€éããå°å ¥ããå¯èœæ§ã¯ãããŸããã匷åãããåå®å šæ§ãã³ãŒãã®åå©çšæ§ã®åäžãããã³æè»æ§ã®åäžãšãã£ãå©ç¹ã¯ãå€ãã®å Žåã課é¡ãäžåããŸãããžã§ããªã¯ã¹ãæ¢æ±ããå®éšãç¶ããã«ã€ããŠããããã®æ©èœã掻çšããŠè€éãªããã°ã©ãã³ã°åé¡ã解決ããæ°ããåµé çãªæ¹æ³ãçºèŠããã§ãããã
ãã®èª²é¡ãåãå ¥ããäŸããåŠã³ãé«åºŠãªãžã§ããªãã¯å¶çŽã«å¯Ÿããçè§£ãç¶ç¶çã«æ·±ããŠãã ãããããªãã®ã³ãŒãã¯ããã«æè¬ããã§ãããïŒ